﻿
using NicoView.Model.Service.Events;
using NicoView.Model.Service.Results;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace NicoView.Model.Service.Comments
{
    /// <summary>
    /// ニコニココメントクライアントインターフェース
    /// </summary>
    public interface INicoCommentClient:IDisposable
    {
        /// <summary>
        /// このコメントクライアントにより受信されたコメントリスト
        /// </summary>
        ICollection<NotifyNicoComment> Comments { get; }

        /// <summary>
        /// このコメントクライアントに関連する情報
        /// </summary>
        INicoCommentClientInfo Info { get; }

        /// <summary>
        /// 非同期にコメントを送信
        /// </summary>
        /// <param name="comment"></param>
        /// <returns></returns>
        Task<Result<NicoCommentSendResut>> SendAsync(NicoSendComment comment);


        /// <summary>
        /// 非同期に過去コメント取得をリクエスト
        /// </summary>
        /// <param name="count"></param>
        /// <returns></returns>
        Task WayBacRequestkAsync(int count);

        /// <summary>
        /// 現在接続中か判定
        /// </summary>
        bool Connected { get; }


        /// <summary>
        /// 送信中か判定
        /// </summary>
        bool IsSendding { get; }

        /// <summary>
        /// このコメントクライアントで使用できるコメント色
        /// </summary>
        ICollection<INicoCommentColor> Colors { get; }

        /// <summary>
        /// このコメントクライアントで使用できるコメントサイズ
        /// </summary>
        ICollection<INicoCommentSize> Sizings { get; }

        /// <summary>
        /// このコメントクライアントで使用できるコメント表示位置
        /// </summary>
        ICollection<INicoCommentPosition> Positions { get; }

        /// <summary>
        /// アクティブ人数を計算
        /// </summary>
        /// <param name="elapesed"></param>
        /// <returns></returns>
        int CalcActiveWatchCount(TimeSpan elapesed);

        /// <summary>
        /// コメント受信が一段落した後に呼ばれるイベントハンドラ
        /// </summary>
        event NicoCommentReceivePeriodHandler ReceivePeriod;

        /// <summary>
        /// コメント受信時に呼び出されるイベントハンドラ
        /// </summary>
        event NicoCommentReceiveHandler Received;

        /// <summary>
        /// ハートビート受信時に呼び出されるイベントハンドラ
        /// </summary>
        event NicoView.Model.Service.Lives.NicoLiveCommentClient.NicoLiveHeartBeatHandler HeartBeatReceived;

        /// <summary>
        /// ユーザ情報取得リクエストが発生した場合に呼び出されるイベントハンドラ
        /// </summary>
        event NicoCommentGetUserRequestHandler UserInfoRequest;

        /// <summary>
        /// disconnectedコメント受信時に呼びされるイベントハンドラ
        /// </summary>
        event NicoCommentDisconnectRequestHandler Disconnected;

        /// <summary>
        /// 送信結果受信時に呼び出されるイベントハンドラ
        /// </summary>
        event NicoCommentSentResultHandler SentResult;


        /// <summary>
        /// thradコメント受信時に呼び出されるイベントハンドラ
        /// </summary>
        event NicoCommentThreadHandler ThreadReceived;
    }
}
